﻿2026-05-14T10:45:42.7446811Z ##[group]Run pnpm verify:phase-4
2026-05-14T10:45:42.7447310Z [36;1mpnpm verify:phase-4[0m
2026-05-14T10:45:42.7468383Z shell: /usr/bin/bash -e {0}
2026-05-14T10:45:42.7468635Z env:
2026-05-14T10:45:42.7468880Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-14T10:45:42.7469199Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-14T10:45:42.7469434Z   SKIP_TRACE_CHECK: 1
2026-05-14T10:45:42.7469643Z ##[endgroup]
2026-05-14T10:45:43.0567438Z 
2026-05-14T10:45:43.0568503Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-14T10:45:43.0569747Z > node scripts/verify-phase-4.mjs
2026-05-14T10:45:43.0570398Z 
2026-05-14T10:45:43.0871914Z 
2026-05-14T10:45:43.0872361Z === Workspace: typecheck ===
2026-05-14T10:45:43.0872933Z >>> pnpm -r typecheck
2026-05-14T10:45:43.3930040Z Scope: 5 of 6 workspace projects
2026-05-14T10:45:43.3982136Z packages/db typecheck$ tsc --noEmit
2026-05-14T10:45:43.3990453Z packages/game-logic typecheck$ tsc --noEmit
2026-05-14T10:45:46.0124577Z packages/game-logic typecheck: Done
2026-05-14T10:45:46.0167470Z packages/protocol typecheck$ tsc --noEmit
2026-05-14T10:45:48.1802137Z packages/db typecheck: Done
2026-05-14T10:45:49.3924844Z packages/protocol typecheck: Done
2026-05-14T10:45:49.3931466Z apps/client typecheck$ tsc --noEmit
2026-05-14T10:45:49.3934624Z apps/server typecheck$ tsc --noEmit
2026-05-14T10:46:01.0057975Z apps/client typecheck: Done
2026-05-14T10:46:01.5887358Z apps/server typecheck: Done
2026-05-14T10:46:01.6028817Z 
2026-05-14T10:46:01.6042267Z === Lint: protocol-sync ===
2026-05-14T10:46:01.6061513Z >>> pnpm lint:protocol-sync
2026-05-14T10:46:01.9084680Z 
2026-05-14T10:46:01.9085741Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-14T10:46:01.9087094Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-14T10:46:01.9087773Z 
2026-05-14T10:46:01.9384064Z lint-protocol-sync: OK
2026-05-14T10:46:01.9501418Z 
2026-05-14T10:46:01.9502004Z === Lint: game-logic-purity ===
2026-05-14T10:46:01.9502941Z >>> pnpm lint:game-logic-purity
2026-05-14T10:46:02.2466236Z 
2026-05-14T10:46:02.2466919Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-14T10:46:02.2467428Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-14T10:46:02.2467655Z 
2026-05-14T10:46:02.2760073Z lint-game-logic-purity: OK (7 file(s) clean)
2026-05-14T10:46:02.2879677Z 
2026-05-14T10:46:02.2882177Z === Lint: better-auth-schema-sync ===
2026-05-14T10:46:02.2887285Z >>> pnpm lint:better-auth-schema-sync
2026-05-14T10:46:02.5821006Z 
2026-05-14T10:46:02.5822248Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-14T10:46:02.5823686Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-14T10:46:02.5824447Z 
2026-05-14T10:46:04.2059144Z lint-better-auth-schema-sync: OK
2026-05-14T10:46:04.2180551Z 
2026-05-14T10:46:04.2181851Z === Lint: rate-limit-budgets ===
2026-05-14T10:46:04.2182680Z >>> pnpm lint:rate-limit-budgets
2026-05-14T10:46:04.5156755Z 
2026-05-14T10:46:04.5157924Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-14T10:46:04.5159208Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-14T10:46:04.5159863Z 
2026-05-14T10:46:04.5480753Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-14T10:46:04.5596979Z 
2026-05-14T10:46:04.5597542Z === Lint: no-clipboard-rce ===
2026-05-14T10:46:04.5598377Z >>> pnpm lint:no-clipboard-rce
2026-05-14T10:46:04.8578520Z 
2026-05-14T10:46:04.8579519Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-14T10:46:04.8581135Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-14T10:46:04.8581890Z 
2026-05-14T10:46:04.8903418Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-14T10:46:04.9014534Z 
2026-05-14T10:46:04.9015076Z === Lint: room-layout ===
2026-05-14T10:46:04.9015738Z >>> pnpm lint:room-layout
2026-05-14T10:46:05.1953889Z 
2026-05-14T10:46:05.1954911Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-14T10:46:05.1956079Z > node tools/scripts/lint-room-layout.mjs
2026-05-14T10:46:05.1957381Z 
2026-05-14T10:46:05.2287288Z lint-room-layout: OK
2026-05-14T10:46:05.2401424Z 
2026-05-14T10:46:05.2401993Z === ADR 0004 lint ===
2026-05-14T10:46:05.2402696Z >>> pnpm lint:adr:0004
2026-05-14T10:46:05.5377999Z 
2026-05-14T10:46:05.5379072Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-14T10:46:05.5380796Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-14T10:46:05.5382088Z 
2026-05-14T10:46:05.5673565Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-14T10:46:05.5784225Z 
2026-05-14T10:46:05.5784785Z === Drizzle: emit-check ===
2026-05-14T10:46:05.5785956Z >>> pnpm db:emit-check
2026-05-14T10:46:05.8762734Z 
2026-05-14T10:46:05.8765750Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-14T10:46:05.8770377Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-14T10:46:05.8772496Z 
2026-05-14T10:46:06.3207846Z No config path provided, using default 'drizzle.config.ts'
2026-05-14T10:46:06.3209508Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-14T10:46:06.7347456Z 8 tables
2026-05-14T10:46:06.7350532Z accounts 8 columns 1 indexes 0 fks
2026-05-14T10:46:06.7352131Z audit_log 6 columns 0 indexes 2 fks
2026-05-14T10:46:06.7353154Z characters 9 columns 0 indexes 1 fks
2026-05-14T10:46:06.7354277Z inventory_items 4 columns 0 indexes 1 fks
2026-05-14T10:46:06.7355487Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-14T10:46:06.7356985Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-14T10:46:06.7358271Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-14T10:46:06.7359648Z sessions 5 columns 0 indexes 1 fks
2026-05-14T10:46:06.7360423Z 
2026-05-14T10:46:06.7362142Z No schema changes, nothing to migrate 😴
2026-05-14T10:46:07.2030762Z 
2026-05-14T10:46:07.2031823Z === Drizzle: schema-sync ===
2026-05-14T10:46:07.2034196Z >>> pnpm lint:schema-sync
2026-05-14T10:46:07.5181579Z 
2026-05-14T10:46:07.5182806Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-14T10:46:07.5187946Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-14T10:46:07.5190173Z 
2026-05-14T10:46:07.5434999Z OK
2026-05-14T10:46:07.5552189Z 
2026-05-14T10:46:07.5552728Z === Drizzle: source-comments ===
2026-05-14T10:46:07.5553431Z >>> pnpm lint:source-comments
2026-05-14T10:46:07.8506378Z 
2026-05-14T10:46:07.8507362Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-14T10:46:07.8510200Z > pnpm -C packages/db run lint:source-comments
2026-05-14T10:46:07.8510639Z 
2026-05-14T10:46:08.1632443Z 
2026-05-14T10:46:08.1633837Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-14T10:46:08.1635069Z > node scripts/check-source-comments.mjs
2026-05-14T10:46:08.1635644Z 
2026-05-14T10:46:08.1919154Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-14T10:46:08.2117986Z 
2026-05-14T10:46:08.2118444Z === Workspace: test ===
2026-05-14T10:46:08.2119199Z >>> pnpm -r test
2026-05-14T10:46:08.5153385Z Scope: 5 of 6 workspace projects
2026-05-14T10:46:08.5208639Z packages/db test$ vitest run
2026-05-14T10:46:08.5217458Z packages/game-logic test$ vitest run
2026-05-14T10:46:09.0252299Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-14T10:46:09.0272550Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-14T10:46:09.4440320Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-14T10:46:09.6719183Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:46:09.8893070Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-14T10:46:10.0588216Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T10:46:10.1282232Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:46:10.2849939Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:46:10.3528666Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:46:10.5683075Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:46:10.7912813Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T10:46:10.9973413Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:46:11.0960254Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-14T10:46:11.1068746Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-14T10:46:11.1112193Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-14T10:46:11.1131485Z packages/db test: [2m   Start at [22m 10:46:09
2026-05-14T10:46:11.1147897Z packages/db test: [2m   Duration [22m 2.07s[2m (transform 187ms, setup 0ms, import 1.45s, tests 29ms, environment 1ms)[22m
2026-05-14T10:46:11.1368606Z packages/db test: Done
2026-05-14T10:46:11.1391761Z packages/protocol test$ vitest run
2026-05-14T10:46:11.2203179Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:46:11.4373354Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:46:11.4486302Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-14T10:46:11.4642222Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-14T10:46:11.4702161Z packages/game-logic test: [2m   Start at [22m 10:46:09
2026-05-14T10:46:11.4782696Z packages/game-logic test: [2m   Duration [22m 2.41s[2m (transform 235ms, setup 0ms, import 428ms, tests 87ms, environment 2ms)[22m
2026-05-14T10:46:11.5322050Z packages/game-logic test: Done
2026-05-14T10:46:11.6103232Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-14T10:46:11.8896195Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T10:46:12.0476596Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:46:12.2091499Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:46:12.3568883Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:46:12.3624175Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-14T10:46:12.3642457Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-14T10:46:12.3644700Z packages/protocol test: [2m   Start at [22m 10:46:11
2026-05-14T10:46:12.3646505Z packages/protocol test: [2m   Duration [22m 745ms[2m (transform 112ms, setup 0ms, import 212ms, tests 30ms, environment 0ms)[22m
2026-05-14T10:46:12.3929543Z packages/protocol test: Done
2026-05-14T10:46:12.3935479Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-14T10:46:12.3937567Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-14T10:46:12.9098414Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-14T10:46:12.9983051Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-14T10:46:14.0843490Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 72[2mms[22m[39m
2026-05-14T10:46:14.5199220Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 26[2mms[22m[39m
2026-05-14T10:46:14.8022959Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-14T10:46:14.8315326Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-14T10:46:14.8332599Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-14T10:46:14.9071741Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 258[2mms[22m[39m
2026-05-14T10:46:15.0403012Z apps/server test: {"level":40,"time":1778755575036,"pid":3281,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:46:15.0442283Z apps/server test: {"level":40,"time":1778755575040,"pid":3281,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:46:15.0461565Z apps/server test: {"level":40,"time":1778755575041,"pid":3281,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:46:15.0488440Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-14T10:46:15.9812742Z apps/server test: {"level":30,"time":1778755575972,"pid":3299,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-14T10:46:15.9821357Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 699[2mms[22m[39m
2026-05-14T10:46:16.0032677Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 554[2mms[22m[39m
2026-05-14T10:46:16.1494236Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 62[2mms[22m[39m
2026-05-14T10:46:16.9764934Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-14T10:46:16.9768360Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-q7SDov/rebno.db
2026-05-14T10:46:16.9783842Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:46:16.9841952Z apps/server test: [run-migrations] OK
2026-05-14T10:46:16.9876896Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-14T10:46:16.9892133Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-7hdqCX/rebno.db
2026-05-14T10:46:16.9904126Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:46:16.9906875Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-14T10:46:16.9908541Z apps/server test: [run-migrations] OK
2026-05-14T10:46:16.9972868Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T10:46:17.0001926Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-RoyWS9/rebno.db
2026-05-14T10:46:17.0005905Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:46:17.0006931Z apps/server test: [run-migrations] OK
2026-05-14T10:46:17.0008645Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T10:46:17.0010481Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-RoyWS9/rebno.db
2026-05-14T10:46:17.0012216Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:46:17.0013287Z apps/server test: [run-migrations] OK
2026-05-14T10:46:17.0062580Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 57[2mms[22m[39m
2026-05-14T10:46:17.2142448Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-14T10:46:17.2877483Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-14T10:46:17.5042629Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-14T10:46:17.7637758Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-14T10:46:18.0159456Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:46:18.4170296Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 46[2mms[22m[39m
2026-05-14T10:46:18.8275917Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-14T10:46:18.8287077Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ suppress logs { quiet: true }
2026-05-14T10:46:18.8288815Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-14T10:46:19.6423409Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T10:46:19.6544731Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-14T10:46:19.6588672Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-14T10:46:19.6613953Z apps/server test: [2m   Start at [22m 10:46:12
2026-05-14T10:46:19.6646114Z apps/server test: [2m   Duration [22m 6.73s[2m (transform 482ms, setup 0ms, import 3.45s, tests 944ms, environment 2ms)[22m
2026-05-14T10:46:19.6871913Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-14T10:46:19.6949382Z apps/server test: Done
2026-05-14T10:46:20.3617149Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-14T10:46:21.0209760Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T10:46:21.7412979Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 67[2mms[22m[39m
2026-05-14T10:46:22.4704855Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 87[2mms[22m[39m
2026-05-14T10:46:23.1351506Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 31[2mms[22m[39m
2026-05-14T10:46:23.8523291Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 71[2mms[22m[39m
2026-05-14T10:46:24.5726014Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 77[2mms[22m[39m
2026-05-14T10:46:25.2328458Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:46:25.9453821Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 78[2mms[22m[39m
2026-05-14T10:46:26.5944656Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:46:27.2504775Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:46:27.8866090Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:46:28.5359804Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-14T10:46:29.1835398Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:46:29.8345735Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:46:30.5151292Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:46:31.1785690Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:46:31.8332691Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-14T10:46:32.4912778Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-14T10:46:33.1396562Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:46:33.7971978Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:46:33.8182241Z apps/client test: [2m Test Files [22m [1m[32m26 passed[39m[22m[90m (26)[39m
2026-05-14T10:46:33.8189877Z apps/client test: [2m      Tests [22m [1m[32m193 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (197)[39m
2026-05-14T10:46:33.8191607Z apps/client test: [2m   Start at [22m 10:46:12
2026-05-14T10:46:33.8193613Z apps/client test: [2m   Duration [22m 20.82s[2m (transform 803ms, setup 55ms, collect 1.28s, tests 927ms, environment 12.00s, prepare 2.42s)[22m
2026-05-14T10:46:33.9525663Z apps/client test: Done
2026-05-14T10:46:33.9612614Z 
2026-05-14T10:46:33.9612943Z verify-phase-4: OK (12 steps green)
